#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define FILE_NAME(num) "log.txt"#num

#define ONE (1<<0)
#define TWO (1<<1)
#define THREE (1<<2)
#define FOUR (1<<3)

void show(int flags)
{
    if(flags & ONE)printf("ONE\n");
    if(flags & TWO)printf("TWO\n");
    if(flags & THREE)printf("THREE\n");
    if(flags & FOUR)printf("FOUR\n");
}

#if 0
int main()
{
    // 先来介绍通过传不同的比特位确定不同的选项
    /*
    show(ONE);
    printf("------------------------------------------\n");
    show(TWO | THREE);
    printf("------------------------------------------\n");
    show(ONE | TWO | THREE);
    printf("------------------------------------------\n"); 
    show(ONE | TWO | THREE | FOUR);
    printf("------------------------------------------\n");
    */
    
    umask(0);
    // 系统调用接口
    // O_RDONLY 读
    // O_WRONLY 写
    // O_CREAT 没有则创建
    // O_TRUNC 每次打开都清空
    // O_APPEND 每次打开在末尾追加
    // int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666);   // 每次写时清空 
    // int fd = open(FILE_NAME, O_WRONLY | O_APPEND);   // 每次写时不清空，O_CREAT和最后0666的权限可以不加了，因为文件已经存在 
    int fd = open(FILE_NAME, O_RDONLY);


    // 写文件
    //int cnt = 5;
    //char buf[64];
    //while(cnt)
    //{
    //    sprintf(buf, "hello world : %d\n",cnt--);
    //    write(fd, buf, strlen(buf));// 向文件中写入string的时候，要不要+1 ? 
    //    // 你以\0作为字符串的结尾，是C语言的规定，和我文件有什么关系呢?
    //}

    // 读文件
    char buffer[1024];
    ssize_t num = read(fd, buffer, sizeof(buffer) - 1);
    // num是读取到的字节个数
    if(num > 0)buffer[num] = 0;     // 这里回到C语言，字符串应该以'\0'结尾
    
    printf("%s\n",buffer);




    // 关闭文件
    close(fd);




    // C式文件接口
    // r(只读,不存在会报错)  w(只写,不存在会创建)  r+(可读可写)  w+(可读可写)  a(追加)  a+(可读可追加)
    //FILE *fp = fopen(FILE_NAME, "r");
    //if(NULL == fp)
    //{
    //    perror("fopen");
    //    exit(errno);
    //}

    // 写文件
    //int cnt = 5;
    //while(cnt)
    //{
    //    // sprintf(buf, "hello world: %d\n", cnt--);
    //    // fputs(buf, fp);

    //    // 其实上面两个接口可以写成一个
    //    fprintf(fp, "hello world: %d\n", cnt--);
    //}

    // 读文件
    //char buf[64];
    //while(fgets(buf, sizeof(buf) - 1, fp) != NULL)
    //{
    //    buf[strlen(buf) - 1] = 0;
    //    puts(buf);
    //}

    //fclose(fp);     // 关闭文件

    return 0;
}
#endif


int main()
{

    // 初识文件描述符
    int fd1 = open(FILE_NAME(1), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd2 = open(FILE_NAME(2), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd3 = open(FILE_NAME(3), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd4 = open(FILE_NAME(4), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd5 = open(FILE_NAME(5), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    

    printf("stdin->fd: %d\n",stdin->_fileno);
    printf("stdout->fd: %d\n",stdout->_fileno);
    printf("stderr->fd: %d\n",stderr->_fileno);
    printf("fd1: %d\n",fd1);
    printf("fd2: %d\n",fd2);
    printf("fd3: %d\n",fd3);
    printf("fd4: %d\n",fd4);
    printf("fd5: %d\n",fd5);
        
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);

    return 0;
}




